﻿// demo1-C++入门.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。

//命名空间
/*
#include <iostream>
#include<stdio.h>
int x = 0;
//命名空间可以定义变量，函数，结构体，
namespace bite1
{
   int x = 5;
}
namespace bite1      //同名的命名空间编译器会把他们合并起来
{
    int y = 4;
}
namespace bite2
{
    int z = 6;
}
//编译器搜索原则：先局部域搜索，再去全局域搜索，前面都找不到则报错
int main()
{
    //C风格代码
    int x = 1;
    std::cout << "Hello World!\n";
    printf("x = %d\n", x);                       //全局、局部同一变量，局部优先
    printf("x = %d\n", ::x);                     //打印全局可以用::域作用限定符
    printf("bite1 的 x = %d\n", bite1::x);       //访问命名空间域bite1中的变量x
    printf("bite1 的 y = %d\n", bite1::y);       //访问命名空间域bite1中的变量y
    printf("bite2 的 z = %d\n", bite2::z);       //访问命名空间域bite2
    //printf("bite2 的 x = %d\n", bite2::y);     //访问命名空间域bite2中不存在的变量则会报错
}
*/


/*
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
//::域作用限定符
// 编译器搜索原则：
// 不指定域：1、当前局部域   2、全局域  
// 指定域    3、如果指定了，直接去指定域搜索

namespace bite1                                  //命名空间可以定义变量，函数，结构体，
{
    int rand = 6;                                //变量
    int x = 9;
    int Add(int right, int left)                 //函数
    {
        return right + left;
    }
    struct Node                                  //结构体
    {
        struct Node* next;
        int val;
    };
}
namespace bite2
{
    int y = 2;
}

int main()
{
    printf("bite1::x = %d\n", bite1::x);
    printf("bit2::y = %d\n", bite2::y);
    printf("bite1::rand = %d\n", bite1::rand);
    printf("rand 的地址 = %p\n", rand);
    printf("bite1::Add(3,4) = %d\n", bite1::Add(3,4));
    return 0;
}
*/


/*
#include<iostream>
#include"Queue.h"                //队列
#include"List.h"                 //链表

using namespace cpq;             //展开的命名空间
int main()
{
    struct QNode node1;
    struct cpq::QNode node2;
    struct cpq::QNode node3;
    return 0;
}
*/

/*
#include<iostream>
using namespace std;         //std的所有C++库命名空间

int main()
{
    std::cout << "hello world" << std::endl;
    std::cout << "hello world" << std::endl;
    std::cout << "hello world" << std::endl;
    std::cout << "hello world" << std::endl;
    std::cout << "hello world" << std::endl;
    std::cout << "hello world" << std::endl;
    cout << "hello world" << endl;                  //std::可以省略
}
*/


/*
#include<iostream>
using namespace std;
namespace N1
{
    int a = 5, b = 8;
    int Add(int left, int right)
    {
        return left + right;
    }
}
namespace N2                                 //命名空间嵌套
{
    int x = 6, y = 9;
    int Sub(int left, int right)
    {
        return left - right;
    }
    namespace N3
    {
        int vx = 8, vy = 9;
        int Mul(int left, int right)
        {
            return left * right;
        }
    }
}

int Q = 8;                 //1.加命名空间名称及作用域限定符
using N1::a;               //2.使用using将命名空间中某个成员引入
using namespace N1;        //3.使用using namespace 命名空间名称引入

int main()
{
    cout << "::Q = " << ::Q << endl;                     //1.作用域限定符::访问全局变量
    cout << "a = " << a << endl;                         //2.使用using将命名空间中某个成员引入
    cout << "N1::a = " << N1::a << endl;                 //3.使用using namespace 命名空间名称引入

    cout << "N1::a = " << N1::a << endl;
    cout << "N1::b = " << N1::b << endl;
    cout << "N1::Add(3, 6) = " << N1::Add(3, 6) << endl;

    cout << "N2::x = " << N2::x << endl;
    cout << "N2::y = " << N2::y << endl;
    cout << "N2::Sub(6, 3) = " << N2::Sub(6, 3) << endl;

    cout << "N2::N3::vx = " << N2::N3::vx << endl;
    cout << "N2::N3::vy = " << N2::N3::vy << endl;
    cout << "N2::N3::Mul(8,9) = " << N2::N3::Mul(8, 9) << endl;
    return 0;
}
*/

//缺省/默认参数
/*
#include<iostream>
using namespace std;

void Func(int a = 0)
{
    cout << "a = " << a << endl;
}
//半缺省，从左往右连续传参，不能够跳跃传值，也不能从右往左传值
void Func1(int p1, int p2 = 20, int p3 = 30) {
    cout << "p1 = " << p1 << endl;
    cout << "p2 = " << p2 << endl;
    cout << "p3 = " << p3 << endl << endl;
}

int main()
{
    Func();                       //不带参数调用，会保留缺省值
    Func(1);
    Func1(1, 2, 3);               //
    Func1(1, 2);                  //
    Func1(1);                     //
    //Func1(, 2, );               //不能跳跃调用
    //Func1(, , 3);               //不能从右往左传值
}
*/